home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1997 #3
/
Amiga Plus CD - 1997 - No. 03.iso
/
pd
/
programmierung
/
alienbreed3d2_src
/
newrender.s
< prev
next >
Wrap
Text File
|
1997-01-31
|
58KB
|
4,107 lines
* the 'Hello World' program in 68000 Assembler
* the C version can be found in the Intuition manual
* this source code (C) HiSoft 1992 All Rights Reserved
* for Devpac Amiga Version 2 the following symbols were changed
* to avoid clashes with the new include files:
* Screen->MyScreen, NewScreen->MyNewScreen
* Window->MyWindow, NewWindow->MyNewWindow
opt c+,d+
include workbench:utilities/devpac/system use pre-assembled header
include exec/exec_lib.i
include intuition/intuition.i
include intuition/intuition_lib.i
include graphics/graphics_lib.i
include graphics/text.i
INTUITION_REV equ 31 v1.1
GRAPHICS_REV equ 31 v1.1
* Open the intuition library
moveq #100,d4 default error return code
moveq #INTUITION_REV,d0 version
lea int_name(pc),a1
CALLEXEC OpenLibrary
tst.l d0
beq exit_false if failed then quit
move.l d0,_IntuitionBase else save the pointer
moveq #GRAPHICS_REV,d0
lea graf_name(pc),a1
CALLEXEC OpenLibrary
tst.l d0
; beq exit_closeint if failed then close Int, exit
move.l d0,_GfxBase
lea MyNewScreen(pc),a0
CALLINT OpenScreen open a screen
tst.l d0
; beq exit_closeall if failed the close both, exit
move.l d0,MyScreen
move.l MyScreen,a0
lea sc_BitMap(a0),a0
lea bm_Planes(a0),a0
move.l #RAWSCRN,(a0)
move.l #RAWSCRN+10240,4(a0)
move.l #RAWSCRN+10240*2,8(a0)
move.l #RAWSCRN+10240*3,12(a0)
move.l #RAWSCRN+10240*4,16(a0)
move.l #RAWSCRN+10240*5,20(a0)
move.l #RAWSCRN+10240*6,24(a0)
move.l #RAWSCRN+10240*7,28(a0)
* now initialise a NewWindow structure. This is normally easier to
* do with dc.w/dc.l statement etc, but for comparison with the C
* version we do it like this
lea MyNewWindow(pc),a0 good place to start
move.w #20,nw_LeftEdge(a0)
move.w #20,nw_TopEdge(a0)
move.w #300,nw_Width(a0)
move.w #100,nw_Height(a0)
move.b #0,nw_DetailPen(a0)
move.b #1,nw_BlockPen(a0)
move.l #window_title,nw_Title(a0)
_temp set WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
move.l #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
move.l #CLOSEWINDOW,nw_IDCMPFlags(a0)
move.w #CUSTOMSCREEN,nw_Type(a0)
clr.l nw_FirstGadget(a0)
clr.l nw_CheckMark(a0)
move.l MyScreen(pc),nw_Screen(a0)
clr.l nw_BitMap(a0)
move.w #100,nw_MinWidth(a0)
move.w #25,nw_MinHeight(a0)
move.w #640,nw_MaxWidth(a0)
move.w #200,nw_MaxHeight(a0)
* thats it set up, now open the window (a0=NewWindow already)
; CALLINT OpenWindow
; tst.l d0
; beq exit_closescr if failed
; move.l d0,MyWindow save it
;
; move.l d0,a1 window
; move.l wd_RPort(a1),a1 rastport
; moveq #20,d0 X
; moveq #20,d1 Y
; CALLGRAF Move move the cursor
;
; move.l MyWindow(pc),a0
; move.l wd_RPort(a0),a1 rastport
; lea hello_message(pc),a0
; moveq #11,d0
; CALLGRAF Text print something
;
; move.l MyWindow(pc),a0
; move.l wd_UserPort(a0),a0
; move.b MP_SIGBIT(a0),d1 (misprint in manual)
; moveq #0,d0
; bset d1,d0 do a shift
; CALLEXEC Wait
; moveq #0,d4 return code
* various exit routines that do tidying up, given a return code in d4
; move.l MyWindow(pc),a0
; CALLINT CloseWindow
;exit_closescr
; move.l MyScreen(pc),a0
; CALLINT CloseScreen
;exit_closeall
; move.l _GfxBase(pc),a1
; CALLEXEC CloseLibrary
;exit_closeint
; move.l _IntuitionBase(pc),a1
; CALLEXEC CloseLibrary
;done:
; bra done
move.l #PALETTEBIT,a0
move.l #COPIEDPAL+4,a1
move.w #255,d0
copydown:
move.b 1(a0),(a1)
move.b 3(a0),4(a1)
move.b 5(a0),8(a1)
add.w #6,a0
add.w #12,a1
dbra d0,copydown
move.w #256,COPIEDPAL
move.w #0,COPIEDPAL+2
LOOKFORME:
move.l MyScreen,a0
lea sc_ViewPort(a0),a0
move.l #COPIEDPAL,a1
move.l _GfxBase,a6
jsr -$372(a6)
move.l MyScreen,a4
move.w sc_MouseX(a4),d0
move.w sc_MouseY(a4),d1
move.w d0,OLDXM
move.w d1,OLDYM
move.l 4.w,a6
move.l #doslibname,a1
moveq #0,d0
jsr -552(a6)
move.l d0,doslib
move.l doslib,a6
move.l #OBJNAME,d1
move.l #1005,d2
jsr -30(a6)
move.l d0,ROTATEDPTS
move.l doslib,a6
move.l d0,d1
move.l #POLYGONDATA,d2
move.l #30000,d3
jsr -42(a6)
move.l doslib,a6
move.l ROTATEDPTS,d1
jsr -36(a6)
loop:
move.l #POLYGONDATA,a3
move.w (a3)+,SORTIT
move.l a3,START_OF_OBJECT
move.w (a3)+,num_points
move.w (a3)+,d6
move.w d6,num_frames
move.l a3,POINTER_TO_POINTERS
lea (a3,d6.w*4),a3
move.l a3,LinesPtr
moveq #0,d5
moveq #0,d2
move.l POINTER_TO_POINTERS,a4
move.w (a4,d5.w*4),d2
add.l START_OF_OBJECT,d2
move.l d2,PtsPtr
move.w 2(a4,d5.w*4),d5
add.l START_OF_OBJECT,d5
move.l d5,PolyAngPtr
move.l d2,a3
move.w num_points,d5
move.l (a3)+,OBJONOFF
move.l a3,PointAngPtr
add.w d5,d5
move.w d5,d2
add.w d5,d5
add.w d5,d2
add.w d2,a3
move.l a3,PtsPtr
move.l MyScreen,a4
move.w sc_MouseX(a4),d0
move.w sc_MouseY(a4),d1
sub.w OLDXM,d0
sub.w OLDYM,d1
add.w d0,OLDXM
add.w d1,OLDYM
btst #6,$bfe001
beq.s .SHIFTABOUT
muls #8190,d0
divs #320,d0
add.w d0,YANG
and.w #8190,YANG
muls #8190,d1
divs #320,d1
and.w #8190,d1
add.w d1,XANG
and.w #8190,XANG
; add.w #40,AANG
; add.w #70,BANG
; and.w #8191,AANG
; and.w #8191,BANG
; add.w #60,CANG
; add.w #90,DANG
; and.w #8191,CANG
; and.w #8191,DANG
bra .ROTABOUT
.SHIFTABOUT
muls #8190,d0
divs #320,d0
add.w d0,BANG
and.w #8190,BANG
muls #8190,d1
divs #320,d1
and.w #8190,d1
add.w d1,AANG
and.w #8190,AANG
.ROTABOUT
move.w AANG,d1
move.w BANG,d3
; cmp.w #2,d6
; bne.s .notsecrot
; move.w CANG,d1
; move.w DANG,d3
;.notsecrot
move.l #SINETABLE,a1
move.w (a1,d1.w),XSIN ;xsin
move.w (a1,d3.w),YSIN ;ysin
add.w #2048,a1
move.w (a1,d1.w),XCOS ;xcos
move.w (a1,d3.w),YCOS ;ycos
move.w XANG,d1
move.w YANG,d3
; cmp.w #2,d6
; bne.s .notsecrot
; move.w CANG,d1
; move.w DANG,d3
;.notsecrot
move.l #SINETABLE,a1
move.w (a1,d1.w),XSIN2 ;xsin
move.w (a1,d3.w),YSIN2 ;ysin
add.w #2048,a1
move.w (a1,d1.w),XCOS2 ;xcos
move.w (a1,d3.w),YCOS2 ;ycos
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
*SHADOW BUFFER CALCULATION
; First, calculate the normal brightnesses
; for points. NB: -1,-1,-1 = this point not used
; in gouraud shading.
move.l #NORMBRIGHTS,a2
move.l PointAngPtr,a0
move.w num_points,d7
move.l #NORMVECTS,a5
subq #1,d7
CALCNORMBRIGHTS:
move.w (a0)+,d0
move.w (a0)+,d1
move.w (a0)+,d2
move.w #0,d6
cmp.w #-1,d0
bne.s .notnot
cmp.w #-1,d1
bne.s .notnot
cmp.w #-1,d2
bne.s .notnot
move.w #-1,x1
move.w #-1,y1
move.w #-1,z1
bra .dontbother
.notnot:
neg.w d1
move.w d0,d3
move.w d2,d5
muls YCOS,d0
muls YSIN,d2
sub.l d2,d0
add.l d0,d0
swap d0
; asr.l #6,d0 ; new x*512
muls YSIN,d3
muls YCOS,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS,d1
muls XSIN,d2
sub.l d2,d1
add.l d1,d1
swap d1
muls XSIN,d4
muls XCOS,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d4,d2 ; new z
move.w d0,d3
move.w d2,d5
muls YCOS2,d0
muls YSIN2,d2
sub.l d2,d0
add.l d0,d0
swap d0
muls YSIN2,d3
muls YCOS2,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS2,d1
muls XSIN2,d2
sub.l d2,d1
add.l d1,d1
swap d1
muls XSIN2,d4
muls XCOS2,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d0,x1
move.w d1,y1
move.w d4,z1
move.w d1,d6 ; new y
asr.w #4,d6
add.w #20,d6
ble.s .okokok
moveq #0,d6
.okokok:
add.w #$1c,d6
bge.s .okokokok
moveq #0,d6
.okokokok:
add.w #64,d6
;
; cmp.w #28,d6
; blt.s .okbig
; move.w #28,d6
;.okbig
.dontbother:
move.w x1,(a5)+
move.w y1,(a5)+
move.w z1,(a5)+
move.w d6,(a2)+
dbra d7,CALCNORMBRIGHTS
; Next, calculate the point coords for
; the shadow buffer.
move.l #SHADOWPTS,a2
move.l PtsPtr,a0
move.w num_points,d7
subq #1,d7
ROTPTLOPSHAD:
move.w (a0)+,d0
move.w d0,d3
move.w (a0)+,d1
move.w (a0)+,d2
move.w d2,d5
muls YCOS,d0
muls YSIN,d2
sub.l d2,d0
add.l d0,d0
swap d0
; asr.l #6,d0 ; new x*512
muls YSIN,d3
muls YCOS,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS,d1
muls XSIN,d2
sub.l d2,d1
add.l d1,d1
swap d1
muls XSIN,d4
muls XCOS,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d4,d2 ; new z
move.w d0,d3
move.w d2,d5
muls YCOS2,d0
muls YSIN2,d2
sub.l d2,d0
asr.l #6,d0 ; new x*512
muls YSIN2,d3
muls YCOS2,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS2,d1
muls XSIN2,d2
sub.l d2,d1
asr.l #6,d1 ; new y*512
muls XSIN2,d4
muls XCOS2,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d4,d2 ; new z
ext.l d2
move.w XOFF,d5
ext.l d5
asl.l #8,d5
add.l d5,d5
add.l d5,d0
move.l d0,(a2)+
move.l d1,(a2)+
move.w d2,(a2)+
dbra d7,ROTPTLOPSHAD
***************************************
* Calculate viewer position for specularity..
move.w #0,d0
move.w #0,d1
move.w #-1024,d2
; move.w d0,d3
; move.w d2,d5
;
; muls YCOS,d0
; muls YSIN,d2
; sub.l d2,d0
; add.l d0,d0
; swap d0
; asr.l #6,d0 ; new x*512
;
; muls YSIN,d3
; muls YCOS,d5
; add.l d5,d3
; add.l d3,d3
; swap d3
; move.w d3,d2 ; new z
;
; move.w d1,d4
; move.w d2,d5
; muls XCOS,d1
; muls XSIN,d2
; sub.l d2,d1
; add.l d1,d1
; swap d1
;
; muls XSIN,d4
; muls XCOS,d5
; add.l d5,d4
; add.l d4,d4
; swap d4
; move.w d4,d2 ; new z
move.w d0,d3
move.w d2,d5
muls YCOS2,d0
muls YSIN2,d2
sub.l d2,d0
add.l d0,d0
swap d0
muls YSIN2,d3
muls YCOS2,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS2,d1
muls XSIN2,d2
sub.l d2,d1
add.l d1,d1
swap d1
; asr.l #6,d1 ; new y*512
muls XSIN2,d4
muls XCOS2,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d0,x2b
move.w d1,y2b
move.w d4,z2b
; Now the specular highlight efforts....
move.l #SPECBRIGHTS,a2
move.l #NORMVECTS,a1
move.l #SHADOWPTS,a5
move.w num_points,d7
subq #1,d7
CALCSPECBRIGHTS:
move.w (a1)+,x1
move.w (a1)+,y1
move.w (a1)+,z1
move.w x2b,d0
move.l (a5)+,d1
asr.l #8,d1
asr.l #1,d1
sub.w d1,d0
move.w d0,x2
move.w y2b,d0
move.l (a5)+,d1
asr.l #8,d1
asr.l #1,d1
sub.w d1,d0
move.w d0,y2
move.w z2b,d0
sub.w (a5)+,d0
move.w d0,z2
move.w #0,d6
cmp.w #-1,x1
bne.s .notnot
cmp.w #-1,y1
bne.s .notnot
cmp.w #-1,z1
beq .dontbother
.notnot:
move.w x2,d2
muls d2,d2
move.w y2,d1
muls d1,d1
add.l d1,d2
move.w z2,d1
muls d1,d1
add.l d1,d2
jsr CALCSQROOT
move.w d2,l2
move.w y1,d0
muls z2,d0
move.w y2,d1
muls z1,d1
sub.l d1,d0 ; x4
move.w z1,d1
muls x2,d1
move.w z2,d2
muls x1,d2
sub.l d2,d1 ; y4
move.w x1,d2
muls y2,d2
move.w x2,d3
muls y1,d3
sub.l d3,d2 ; z4
asr.l #8,d0
asr.l #8,d1
asr.l #8,d2
asr.l #2,d0
asr.l #2,d1
asr.l #2,d2
move.w x1,d3
muls d1,d3
move.w y1,d4
muls d0,d4
sub.l d4,d3
asr.l #8,d3
asr.l #1,d3
add.w z2,d3
muls #1024,d3
divs l2,d3
move.w d3,z3
move.w y1,d3
muls d2,d3
move.w z1,d4
muls d1,d4
sub.l d4,d3
asr.l #8,d3
asr.l #1,d3
add.w x2,d3
muls #1024,d3
divs l2,d3
move.w d3,x3
move.w z1,d3
muls d0,d3
move.w x1,d4
muls d2,d4
sub.l d4,d3
asr.l #8,d3
asr.l #1,d3
add.w y2,d3
muls #1024,d3
divs l2,d3
move.w d3,y3
move.w z3,d3
asr.w #4,d3
add.w #128,d3
bge.s .okpp
moveq #0,d3
.okpp
cmp.w #255,d3
ble.s .okppp
move.w #255,d3
.okppp
move.b d3,d6
lsl.w #8,d6
move.w x3,d3
asr.w #4,d3
add.w #128,d3
bge.s .okp
moveq #0,d3
.okp
cmp.w #255,d3
ble.s .okpppp
move.w #255,d3
.okpppp
move.b d3,d6
tst.w y3
blt.s .okpos
move.w x3,d1
asr.w #4,d1
move.w z3,d2
asr.w #4,d2
muls d1,d1
muls d2,d2
add.l d1,d2
jsr CALCSQROOT
tst.w d2
beq.s .okpos
move.w d2,d3
neg.w d3
add.w #127,d3
move.w z3,d4
muls d3,d4
divs d2,d4
asr.w #4,d4
add.w #128,d4
move.b d4,d6
lsl.w #8,d6
move.w x3,d4
muls d3,d4
divs d2,d4
asr.w #4,d4
add.w #128,d4
move.b d4,d6
; neg.w y3
.okpos
; add.w y2,d3
;
; move.w d3,d6
;
; asr.w #4,d6
;
; add.w #30,d6
;
; ble.s .okokok
;
; moveq #0,d6
;
;.okokok:
; add.w #$1c,d6
; bge.s .okokokok
; moveq #0,d6
;.okokokok:
;
; cmp.w #28,d6
; blt.s .okbig
; move.w #28,d6
;.okbig
.dontbother:
move.w d6,(a2)+
move.w y3,(a2)+
dbra d7,CALCSPECBRIGHTS
* NOW THE POINTS FOR ON-SCREENNESS
move.l #ROTATEDPTS,a2
move.l PtsPtr,a0
move.w num_points,d7
subq #1,d7
ROTPTLOP:
move.w (a0)+,d0
move.w d0,d3
move.w (a0)+,d1
move.w (a0)+,d2
move.w d2,d5
muls YCOS,d0
muls YSIN,d2
sub.l d2,d0
asr.l #6,d0 ; new x*512
muls YSIN,d3
muls YCOS,d5
add.l d5,d3
add.l d3,d3
swap d3
move.w d3,d2 ; new z
move.w d1,d4
move.w d2,d5
muls XCOS,d1
muls XSIN,d2
sub.l d2,d1
asr.l #6,d1 ; new y*512
muls XSIN,d4
muls XCOS,d5
add.l d5,d4
add.l d4,d4
swap d4
move.w d4,d2 ; new z
ext.l d2
move.w XOFF,d5
ext.l d5
asl.l #8,d5
add.l d5,d5
add.l d5,d0
move.l d0,(a2)+
move.l d1,(a2)+
move.w d2,(a2)+
dbra d7,ROTPTLOP
; Now convert the rotated points to the screen:
move.l #ROTATEDPTS,a0
move.l #ONSCREENPTS,a2
move.w num_points,d7
subq #1,d7
CONVERTTOSCREEN:
move.l (a0)+,d0
move.l (a0)+,d1
move.w (a0)+,d2
add.w ZOFF,d2
ext.l d2
move.l d0,d3
asr.l #1,d3
add.l d3,d0
move.l d1,d3
asr.l #1,d3
add.l d3,d1
divs d2,d0
divs d2,d1
add.w #160*4,d0
add.w #128*4,d1
move.w d0,(a2)+
move.w d1,(a2)+
dbra d7,CONVERTTOSCREEN
move.w #254,HIGHPOLY
move.l LinesPtr,a1
move.l #PartBuffer,a0
move.l a0,a2
move.w #15,d0
clrpartbuffSHAD:
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
dbra d0,clrpartbuffSHAD
move.l #SHADOWPTS,a2
move.l OBJONOFF,d5
move.w #0,d4
tst.w SORTIT
bne.s PutInPartsSHAD
putinunsortedSHAD:
move.w (a1)+,d7
blt doneallpartsSHAD
lsr.l #1,d5
bcs.s .yeson
addq #2,a1
bra putinunsortedSHAD
.yeson:
move.w (a1)+,d6
move.l #0,(a0)+
move.w d7,(a0)+
move.w d4,(a0)+
addq #1,d4
bra putinunsortedSHAD
PutInPartsSHAD
move.w (a1)+,d7
blt doneallpartsSHAD
lsr.l #1,d5
bcs.s .yeson
addq #2,a1
bra PutInPartsSHAD
.yeson:
move.w (a1)+,d6
move.l 4(a2,d6.w),d0
add.l #200000,d0
move.l #PartBuffer-8,a0
stillfrontSHAD
addq #8,a0
cmp.l (a0),d0
blt stillfrontSHAD
move.l #endparttab-8,a5
domoreshiftSHAD:
move.l -8(a5),(a5)
move.l -4(a5),4(a5)
subq #8,a5
cmp.l a0,a5
bgt.s domoreshiftSHAD
move.l d0,(a0)
move.w d7,4(a0)
move.w d4,6(a0)
addq #1,d4
bra PutInPartsSHAD
doneallpartsSHAD:
move.l #PartBuffer,a0
PartLoopSHAD
move.l (a0)+,d7
blt nomorepartsSHAD
move.l #SAVEHIGHS,a2
move.w 2(a0),d0
move.w HIGHPOLY,(a2,d0.w*2)
moveq #0,d0
move.w (a0),d0
addq #4,a0
add.l START_OF_OBJECT,d0
move.l d0,a1
polylooSHAD:
tst.w (a1)
blt.s nomorepolysSHAD
movem.l a0/a1/d7,-(a7)
bsr doaSHADEpoly
movem.l (a7)+,a0/a1/d7
move.w (a1),d0
lea 18(a1,d0.w*4),a1
bra.s polylooSHAD
nomorepolysSHAD:
sub.w #1,HIGHPOLY
bra PartLoopSHAD
nomorepartsSHAD:
*******************************************
* Now the on-screen bit...
*******************************************
move.l LinesPtr,a1
move.l #PartBuffer,a0
move.l a0,a2
move.w #15,d0
clrpartbuff:
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
move.l #$80000001,(a2)+
dbra d0,clrpartbuff
move.l #ROTATEDPTS,a2
move.l OBJONOFF,d5
moveq #0,d4
tst.w SORTIT
bne.s PutInParts
putinunsorted:
move.w (a1)+,d7
blt doneallparts
lsr.l #1,d5
bcs.s .yeson
addq #2,a1
bra putinunsorted
.yeson:
move.w (a1)+,d6
move.l #0,(a0)+
move.w d7,(a0)+
move.w d4,(a0)+
addq #1,d4
bra putinunsorted
PutInParts
move.w (a1)+,d7
blt doneallparts
lsr.l #1,d5
bcs.s .yeson
addq #2,a1
bra PutInParts
.yeson:
move.w (a1)+,d6
move.l (a2,d6.w),d0
asr.l #8,d0
asr.l #2,d0
muls d0,d0
move.l 4(a2,d6.w),d2
asr.l #8,d2
asr.l #2,d2
muls d2,d2
add.l d2,d0
move.w 8(a2,d6.w),d2
add.w #1024,d2
muls d2,d2
add.l d2,d0
move.l #PartBuffer-8,a0
stillfront
addq #8,a0
cmp.l (a0),d0
blt stillfront
move.l #endparttab-8,a5
domoreshift:
move.l -8(a5),(a5)
move.l -4(a5),4(a5)
subq #8,a5
cmp.l a0,a5
bgt.s domoreshift
move.l d0,(a0)
move.w d7,4(a0)
move.w d4,6(a0)
addq #1,d4
bra PutInParts
doneallparts:
move.l #PartBuffer,a0
PartLoop
move.l (a0)+,d7
blt nomoreparts
move.l #SAVEHIGHS,a2
move.w 2(a0),d0
move.w (a2,d0.w*2),HIGHPOLY
moveq #0,d0
move.w (a0),d0
addq #4,a0
add.l START_OF_OBJECT,d0
move.l d0,a1
polyloo:
tst.w (a1)
blt.s nomorepolys
movem.l a0/a1/d7,-(a7)
bsr doapoly
movem.l (a7)+,a0/a1/d7
move.w (a1),d0
lea 18(a1,d0.w*4),a1
bra.s polyloo
nomorepolys:
sub.w #1,HIGHPOLY
bra PartLoop
nomoreparts:
NOPOLYS:
; btst #6,$bfe001
; beq.s .SHOWSHADOW
move.l FASTBUFFER,a0
add.l #40*320+64,a0
move.l #RAWSCRN,a1
add.l #40*40+8,a1
move.l #(24)-1,d0
move.l #175,d1
move.w #128,d2
move.w #16,d3
moveq #0,d4
moveq #0,d5
jsr CHUNKYTOPLANAR
bra .SHOWNSCRN
.SHOWSHADOW
move.l #SHADOWBUFFER,a0
add.l #40*256,a0
move.l #RAWSCRN,a1
add.l #40*40,a1
move.l #(256/8)-1,d0
move.l #175,d1
move.w #0,d2
move.w #8,d3
moveq #0,d4
moveq #0,d5
jsr CHUNKYTOPLANAR
.SHOWNSCRN:
move.l FASTBUFFER,a0
move.l #NEBBIE,a1
add.l #40*320+64,a0
move.w #175,d0
clrchunk:
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
add.w #(320-192),a0
dbra d0,clrchunk
move.l #SHADOWBUFFER,a0
move.l #-1,d1
move.l #-1,d2
move.w #15,d0
;clrshad:
; move.w #15,d5
;innner
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d2,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; move.l d1,(a0)+
; dbra d5,innner
; exg d1,d2
;
; dbra d0,clrshad
btst #7,$bfe001
beq.s exit_closescr
add.l #$8000,lmxoff
cmp.l #40*65536,lmxoff
blt.s .oksm
sub.l #40*65536,lmxoff
.oksm
bra loop
lmxoff: dc.l 0
exit_closescr
move.l MyScreen(pc),a0
CALLINT CloseScreen
exit_closeall
move.l _GfxBase(pc),a1
CALLEXEC CloseLibrary
exit_closeint
move.l _IntuitionBase(pc),a1
CALLEXEC CloseLibrary
exit_false
move.l #0,d0 return code
rts
TESTTAB: ds.w 30
************************************************
* SUBROUTINES HERE. ****************************
************************************************
**********************************************************
* the definition of the screen - note that in assembler you
* MUST get the sizes of these fields correct, by consulting either
* the RKM or the header files
MyNewScreen dc.w 0,0 left, top
dc.w 320,256 width, height
dc.w 8 depth
dc.b 0,1 pens
dc.w 0 viewmodes
dc.w CUSTOMSCREEN type
dc.l MyFont font
dc.l screen_title title
dc.l 0 gadgets
dc.l 0 bitmap
* my font definition
MyFont dc.l font_name
dc.w TOPAZ_SIXTY
dc.b FS_NORMAL
dc.b FPF_ROMFONT
* the variables
_IntuitionBase dc.l 0 Intuition lib pointer
_GfxBase dc.l 0 graphics lib pointer
MyScreen dc.l 0
MyWindow dc.l 0
MyNewWindow ds.b nw_SIZE a buffer
* some strings
int_name INTNAME
graf_name GRAFNAME
hello_message dc.b 'Hello World'
* these are C strings, so have to be null terminated
screen_title dc.b 'My Own Screen',0
font_name dc.b 'topaz.font',0
window_title dc.b 'A Simple Window',0
even
doaSHADEpoly:
move.w (a1)+,d7 ; sides to draw
addq #2,a1 ; avoid holes
move.l #SHADOWPTS,a3
move.w (a1),d0
move.w 4(a1),d1
move.w 8(a1),d2
muls #10,d0
muls #10,d1
muls #10,d2
move.w 8(a3,d0.w),d3
move.w 8(a3,d1.w),d4
move.w 8(a3,d2.w),d5
move.l (a3,d0.w),d0
move.l (a3,d1.w),d1
move.l (a3,d2.w),d2
asr.l #8,d0
asr.l #8,d1
asr.l #8,d2
asr.l #1,d0
asr.l #1,d1
asr.l #1,d2
sub.w d1,d0
sub.w d1,d2
sub.w d4,d3
sub.w d4,d5
muls d3,d2
muls d5,d0
sub.l d0,d2
bge SHADpolybehind
move.w #20000,d4 ; top
move.w #-20000,d5 ; bottom
move.l #UVCOORDS,a4
putinlinesSHAD:
move.w (a1),d0
move.w 4(a1),d1
moveq #0,d2
move.b 2(a1),d2 ; one end U
move.w d2,2(a4,d0.w*4)
move.b 3(a1),d2 ; one end V
move.w d2,(a4,d0.w*4)
move.b 6(a1),d2 ; two end U
move.w d2,2(a4,d1.w*4)
move.b 7(a1),d2 ; two end V
move.w d2,(a4,d1.w*4)
move.w d0,d2
muls #10,d2
move.w 8(a3,d2.w),d2 ; Z
cmp.w d2,d4
ble.s .oktop
move.w d2,d4
.oktop
cmp.w d2,d5
bge.s .okbot
move.w d2,d5
.okbot
movem.l d4/d5/d7/a1/a3/a4,-(a7)
bsr SIMPLESHADLINE
movem.l (a7)+,d4/d5/d7/a1/a3/a4
addq #4,a1
dbra d7,putinlinesSHAD
addq #4,a1
move.w (a1)+,TEXTUREADD
asr.w #2,d4
asr.w #2,d5
add.w #128,d4
add.w #128,d5
move.w d4,TOPLINE
move.w d5,BOTLINE
* Now draw the shadow polygon....
move.l #SHADOWBUFFER,a2
move.l #LEFTUVS,a0
move.w TOPLINE,d0
move.w BOTLINE,d1
sub.w d0,d1
asl.w #3,d0
add.w d0,a0
muls #(512/8),d0
add.l d0,a2 ; pointer to screen line.
subq #1,d1
blt NOPOLYGONSHAD
DOAHORLINESHAD:
swap d1
move.w RIGHTUVS-LEFTUVS(a0),d0
move.w (a0)+,d7
sub.w d7,d0
blt NOPOLYGONSHAD
move.l a2,-(a7)
; asr.w #2,d0
; asr.w #2,d7
lea (a2,d7.w*2),a2
ext.l d0
addq #1,d0
move.w RIGHTUVS-LEFTUVS(a0),d7
move.w (a0)+,d4
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d5
swap d5
clr.w d5
sub.l d5,d7
divs.l d0,d7
move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d6
swap d6
clr.w d6
sub.l d6,d7
divs.l d0,d7
move.l d7,a3
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes3
and.w #$7fff,d7
add.l #65536*4,a0
.okaddtes3:
ext.l d7
; add.l d7,d7
asl.l #8,d7
add.l d7,a0
move.w #0,d7
subq #1,d0
; d0=xdist
; d4=U a5=DU
; d5=V a6=DV
; d6=Y a3=DY
moveq #0,d1
swap d6
PLOTADOT:
.across
; swap d4
; swap d5
; move.w d4,d2
; lsl.w #8,d2
; swap d4
; move.b d5,d2
; add.l a5,d4
; swap d5
; add.l a6,d5
; swap d6
; move.b (a2)+,d1
; tst.b 1(a0,d2.w*8)
; beq.s .noplottt
move.b d6,(a2)
addq #2,a2
dbra d0,.across
bra.s .plaster
.noplottt:
addq #1,a2
dbra d0,.across
.plaster:
move.l (a7)+,d1
move.l (a7)+,a0
move.l (a7)+,a2
.noline:
add.w #512,a2
swap d1
dbra d1,DOAHORLINESHAD
NOPOLYGONSHAD:
SHADpolybehind:
rts
************************************************
LU: dc.w 0
LV: dc.w 0
RU: dc.w 0
RV: dc.w 0
SIMPLESHADLINE:
move.l #SHADOWPTS,a1
move.l #UVCOORDS,a2
move.w (a2,d0.w*4),LU
move.w 2(a2,d0.w*4),LV
move.w (a2,d1.w*4),RU
move.w 2(a2,d1.w*4),RV
muls #10,d0
muls #10,d1
move.w 8(a1,d0.w),d2 ;fz
move.w 8(a1,d1.w),d7 ;sz
ext.l d2
ext.l d7
move.l #LEFTUVS,a3
asr.l #2,d2
asr.l #2,d7
cmp.l d2,d7
beq .noline
bgt.s .lineonright
.lineonleft:
move.l #RIGHTUVS,a3
exg d0,d1
exg d2,d7
move.l LU,d5
move.l RU,LU
move.l d5,RU
.lineonright:
sub.w d2,d7
add.w #128,d2
lea (a3,d2.w*8),a3
move.w d7,YDIFF
move.l (a1,d0.w),d3 ;fx
move.l (a1,d1.w),d7 ;sx
asl.l #5,d3
asl.l #5,d7
sub.l d3,d7
divs.l YDIFF-2,d7
move.l d7,a0 ; dx
move.l #ROTATEDPTS,a1
move.w LU,d4
move.w LV,d5
move.w RU,d6
move.w RV,d7
sub.w d4,d6
sub.w d5,d7
swap d4
swap d5
clr.w d4
clr.w d5
swap d6
swap d7
clr.w d6
clr.w d7
divs.l YDIFF-2,d6
divs.l YDIFF-2,d7
move.l d6,a4
move.l d7,a5
; asl.w #4,d0
; asl.w #4,d1
move.l 4(a1,d0.w),d6
move.l 4(a1,d1.w),d7
asl.l #5,d6
asl.l #5,d7
sub.l d6,d7
divs.l YDIFF-2,d7
exg d7,a6
exg d7,d6
move.l YDIFF-2,d1
subq #1,d1
; d3=x a0=dx
; d4=u a4=du
; d5=v a5=dv
; d7=y a6=dy
; d1=dz
move.w HIGHPOLY,d7
add.l #128*65536,d3
; add.l #128*65536,d7
.PUTINLINE:
swap d3
move.w d3,(a3)+
swap d3
add.l a0,d3
swap d4
move.w d4,(a3)+
swap d4
swap d5
add.l a4,d4
move.w d5,(a3)+
swap d5
add.l a5,d5
; swap d7
move.w d7,(a3)+
; swap d7
; add.l a6,d7
dbra d1,.PUTINLINE
.noline:
rts
BCOS: dc.w 0
BSIN: dc.w 0
ACOS: dc.w 0
ASIN: dc.w 0
FSX: dc.w 0
FSY: dc.w 0
SSX: dc.w 0
SSY: dc.w 0
**************************************************
doapoly:
move.w (a1)+,d7 ; sides to draw
addq #2,a1 ; avoid holes
move.w 12(a1,d7.w*4),pregour
move.l #ONSCREENPTS,a3
move.w (a1),d0
move.w 4(a1),d1
move.w 8(a1),d2
move.w 2(a3,d0.w*4),d3
move.w 2(a3,d1.w*4),d4
move.w 2(a3,d2.w*4),d5
move.w (a3,d0.w*4),d0
move.w (a3,d1.w*4),d1
move.w (a3,d2.w*4),d2
sub.w d1,d0
sub.w d1,d2
sub.w d4,d3
sub.w d4,d5
muls d3,d2
muls d5,d0
sub.l d0,d2
ble polybehind
; Now we must rotate the polygons coordinates in
; the specular map so that the texturemap is vertical
; relative to the specular map and so that bump-
; mapping can take place unerroneously!
; movem.l d0-d7/a0-a6,-(a7)
move.w #0,BCOS
move.w #128*128,ACOS
move.w #0,BSIN
move.w #0,ASIN
; bra .NOROT
; First calculate angle B
move.l #SPECBRIGHTS,a3
move.w (a1),d0
moveq #0,d5
moveq #0,d6
move.b (a3,d0.w*4),d5
move.b 1(a3,d0.w*4),d6
move.w 4(a1),d0
moveq #0,d3
moveq #0,d4
move.b (a3,d0.w*4),d3
move.b 1(a3,d0.w*4),d4
sub.w d5,d3
sub.w d6,d4
move.w d3,d1
move.w d4,d2
muls d1,d1
muls d2,d2
add.l d1,d2
jsr CALCSQROOT
tst.w d2
beq .NOROT
ext.l d3
asl.l #7,d3
ext.l d4
asl.l #7,d4
divs d2,d3
divs d2,d4
move.w d3,BCOS
neg.w d4
move.w d4,BSIN
moveq #0,d3
move.b 2(a1),d3
moveq #0,d4
move.b 3(a1),d4
moveq #0,d5
move.b 2+4(a1),d5
moveq #0,d6
move.b 3+4(a1),d6
sub.w d3,d5
sub.w d4,d6
move.w d5,d1
move.w d6,d2
muls d1,d1
muls d2,d2
add.l d1,d2
jsr CALCSQROOT
tst.w d2
beq.s .NOROT
ext.l d5
ext.l d6
asl.l #7,d5
asl.l #7,d6
divs d2,d5
divs d2,d6
move.w d5,ACOS
neg.w d6
move.w d6,ASIN
move.w ACOS,d4
move.w ASIN,d5
move.w d4,d2
move.w d5,d3
muls BCOS,d2
muls BSIN,d3
sub.l d3,d2
muls BSIN,d4
muls BCOS,d5
add.l d5,d4
move.w d2,ACOS
move.w d4,ASIN
.NOROT:
; movem.l (a7)+,d0-d7/a0-a6
move.l #ONSCREENPTS,a3
move.w #20000,d4 ; top
move.w #-20000,d5 ; bottom
move.l #UVCOORDS,a4
move.l a1,a0
putinlines:
move.w (a1),d0
move.w 4(a1),d1
moveq #0,d2
move.b 2(a1),d2 ; one end U
move.w d2,2(a4,d0.w*4)
move.b 3(a1),d2 ; one end V
move.w d2,(a4,d0.w*4)
move.b 6(a1),d2 ; two end U
move.w d2,2(a4,d1.w*4)
move.b 7(a1),d2 ; two end V
move.w d2,(a4,d1.w*4)
move.w 2(a3,d0.w*4),d2 ; Z
cmp.w d2,d4
ble.s .oktop
move.w d2,d4
.oktop
cmp.w d2,d5
bge.s .okbot
move.w d2,d5
.okbot
movem.l a0/d4/d5/d7/a1/a3/a4,-(a7)
jsr SIMPLECALCLINE
movem.l (a7)+,a0/d4/d5/d7/a1/a3/a4
addq #4,a1
dbra d7,putinlines
addq #4,a1
move.w (a1)+,TEXTUREADD
asr.w #2,d4
asr.w #2,d5
; add.w #128,d4
; add.w #128,d5
move.w d4,TOPLINE
move.w d5,BOTLINE
move.l #SHADOWPTS,a1
move.w (a0),d0
move.w 4(a0),d1
move.w 8(a0),d2
CHECKVALS:
muls #10,d0
muls #10,d1
muls #10,d2
lea (a1,d0.w),a0
lea (a1,d2.w),a2
lea (a1,d1.w),a1
move.l (a0),d3
sub.l (a1),d3
asr.l #8,d3
asr.l #1,d3
move.l 4(a0),d4
sub.l 4(a1),d4
asr.l #8,d4
asr.l #1,d4
move.w 8(a0),d5
sub.w 8(a1),d5
move.w d3,d6
muls d6,d6
move.w d4,d7
muls d7,d7
add.l d7,d6
move.w d5,d7
muls d7,d7
add.l d7,d6
move.l d6,d2
jsr CALCSQROOT
move.w d2,LEN1
move.l (a2),d0
sub.l (a1),d0
asr.l #8,d0
asr.l #1,d0
move.l 4(a2),d1
sub.l 4(a1),d1
asr.l #8,d1
asr.l #1,d1
move.w 8(a2),d2
sub.w 8(a1),d2
muls d2,d3
muls d0,d5
sub.l d3,d5 ; length
muls.l #$4c,d5
muls d0,d0
muls d1,d1
muls d2,d2
add.l d0,d1
add.l d1,d2
jsr CALCSQROOT
muls LEN1,d2
bgt.s .ok
moveq #1,d2
.ok
divs.l d2,d5
add.l #16,d5
tst.l d5
ble.s .okbr
moveq #0,d5
.okbr:
add.w #$5c,d5
bge.s .okbr2
moveq #0,d5
.okbr2:
move.w d5,d0
asl.w #8,d5
move.w d5,BRIGHTNESS+2
sub.w #$5c,d0
asr.w #1,d0
add.w #$5c,d0
asl.w #8,d0
move.w d0,BRIGHTNESS
***********************************************
* Draw the polygon (shadowed).
move.l FASTBUFFER,a2
move.l #LEFTUVS,a0
move.w TOPLINE,d0
move.w BOTLINE,d1
sub.w d0,d1
asl.w #4,d0
add.w d0,a0
muls #(320/16),d0
add.l d0,a2 ; pointer to screen line.
subq #1,d1
blt NOPOLYGON
tst.b Gouraud
bne GOURPOLY
DOAHORLINE:
swap d1
move.w RIGHTUVS-LEFTUVS(a0),d0
move.w (a0)+,d7
asr.w #2,d0
asr.w #2,d7
sub.w d7,d0
bge.s .okflibble
add.w #14,a0
add.w #320,a2
swap d1
dbra d1,DOAHORLINE
bra NOPOLYGON
.okflibble:
move.l a2,-(a7)
add.w d7,a2
ext.l d0
addq #1,d0
move.l RIGHTUVS-LEFTUVS(a0),d7
move.l (a0)+,d2
sub.l d2,d7
divs.l d0,d7
move.l d7,a1
move.l RIGHTUVS-LEFTUVS(a0),d7
move.l (a0)+,d3
sub.l d3,d7
divs.l d0,d7
move.l d7,a4
move.w RIGHTUVS-LEFTUVS(a0),d7
move.w (a0)+,d4
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d5
swap d5
clr.w d5
sub.l d5,d7
divs.l d0,d7
move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d6
swap d6
clr.w d6
sub.l d6,d7
divs.l d0,d7
move.l d7,a3
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes3
and.w #$7fff,d7
add.l #65536*4,a0
.okaddtes3:
ext.l d7
; add.l d7,d7
asl.l #8,d7
add.l d7,a0
move.w #0,d7
move.l BRIGHTNESS,a6
move.l a7,SAVESTACK
move.l #SHADOWBUFFER,a7
subq #1,d0
; d0=xdist
; d2=U a1=DU
; d3=V a4=DV
; d4=X a5=DX
; d5=Y a6=DY
; d6=Z a3=DZ
move.w HIGHPOLY,d5
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble INTHELIGHT
bra.s INTHEDARK
PENUMBRA:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble INTOLIGHT
bra.s INTODARK
INTHEDARK:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
ble.s INTOPENUM
INTODARK:
move.w #$5c00,d7
swap d2
move.w d2,d1
asl.w #8,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
; move.b (a0,d1.w*4),d7
; beq.s .noplottt
move.b TEXTUREPAL-256(pc,d7.w),(a2)+
dbra d0,INTHEDARK
bra.s PASTAC
.noplottt
addq #1,a2
dbra d0,INTHEDARK
bra.s PASTAC
INTOPENUM:
move.l a6,d7
swap d7
swap d2
move.w d2,d1
asl.w #8,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
; move.b (a0,d1.w*4),d7
; beq.s .noplottt
move.b TEXTUREPAL(pc,d7.w),(a2)+
dbra d0,PENUMBRA
bra.s PASTAC
.noplottt
addq #1,a2
dbra d0,PENUMBRA
bra.s PASTAC
INTHELIGHT:
moveq #0,d1
swap d6
move.w d6,d1
lsl.w #8,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a3,d6
moveq #0,d7
move.b (a7,d1.l),d7
cmp.w d7,d5
bgt.s INTOPENUM
INTOLIGHT:
move.w a6,d7
swap d2
move.w d2,d1
asl.w #8,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
; move.b (a0,d1.w*4),d7
; beq.s .noplottt
move.b TEXTUREPAL(pc,d7.w),(a2)+
dbra d0,INTHELIGHT
bra.s PASTAC
.noplottt:
addq #1,a2
dbra d0,INTHELIGHT
PASTAC
move.l SAVESTACK,a7
move.l (a7)+,d1
move.l (a7)+,a0
move.l (a7)+,a2
.noline:
add.w #320,a2
swap d1
dbra d1,DOAHORLINE
NOPOLYGON:
polybehind:
rts
TEXTUREPAL:
SAVESTACK: dc.l 0
HIGHPOLY: dc.w 0
LEN1: dc.w 0
BRIGHTNESS: dc.l 0
TRANSTEXT: dc.w 0
AANG: dc.w 0
BANG: dc.w 0
CANG: dc.w 0
DANG: dc.w 0
GOURPOLY:
DOAHORLINEGOUR:
swap d1
move.w RIGHTUVS-LEFTUVS(a0),d0
move.w (a0)+,d7
asr.w #2,d0
asr.w #2,d7
sub.w d7,d0
bge.s .okflibble
add.w #14,a0
add.w #320,a2
swap d1
dbra d1,DOAHORLINEGOUR
bra NOPOLYGON
.okflibble:
move.l a2,-(a7)
add.w d7,a2
ext.l d0
addq #1,d0
move.b RIGHTUVS-LEFTUVS(a0),d3
move.b (a0),d2
ext.w d3
ext.w d2
tst.w d2
blt .bothtowards
; bgt .firstaway
tst.w d3
blt .bothtowards
bra .bothaway
.firsttowards:
tst.w d3
ble .bothtowards
; First is towards and second away...
move.w d0,d7 ; total length
move.w d0,d6
neg.w d2
add.w d2,d3
muls d2,d6
divs d3,d6 ; length of first bit
sub.w d6,d7 ; length of second bit
move.w d6,FIRSTLEN
move.w d7,LASTLEN
tst.w FIRSTLEN
beq .bothaway
tst.w LASTLEN
beq .bothtowards
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
move.b 6(a0),d2
move.b 7(a0),d3
move.w d2,FIRSTU
move.w d3,FIRSTV
move.w d2,d4
move.w d3,d5
sub.w #128,d2
sub.w #128,d3
muls d2,d2
muls d3,d3
add.l d3,d2
jsr CALCSQROOT
tst.w d2
beq.s .nochng
sub.w #128,d4
sub.w #128,d5
muls #127,d4
muls #127,d5
divs d2,d4
divs d2,d5
add.w #128,d4
add.w #128,d5
.nochng:
move.w d4,MIDU
move.w d5,MIDV
move.b 6+RIGHTUVS-LEFTUVS(a0),d4
move.b 7+RIGHTUVS-LEFTUVS(a0),d5
move.w d4,SECU
move.w d5,SECV
move.w d4,d2
move.w d5,d3
sub.w #128,d2
sub.w #128,d3
muls d2,d2
muls d3,d3
add.l d3,d2
jsr CALCSQROOT
tst.w d2
beq.s .nochng2
sub.w #128,d4
sub.w #128,d5
muls #127,d4
muls #127,d5
divs d2,d4
divs d2,d5
add.w #128,d4
add.w #128,d5
.nochng2:
add.w MIDU,d4
add.w MIDV,d5
asr.w #1,d4
asr.w #1,d5
move.w d4,MIDU
move.w d5,MIDV
move.l RIGHTUVS-LEFTUVS(a0),d7
move.l (a0)+,d2
and.l #$ffffff,d2
and.l #$ffffff,d7
moveq #0,d3
moveq #0,d5
move.w d2,d3
move.w d7,d5
swap d3
swap d5
sub.l d3,d5
divs.l d0,d5
asr.l #8,d5
move.w d5,RIGHTBRIGHT
asr.l #8,d3
move.w d3,LEFTBRIGHT
clr.w d2
clr.w d7
sub.l d2,d7
asl.l #8,d2
divs.l d0,d7
asl.l #8,d7
move.l RIGHTUVS-LEFTUVS(a0),d6
move.l (a0)+,d3
moveq #0,d4
moveq #0,d5
; move.w d6,d5
; move.w d3,d4
; move.b #0,d4
; move.b #0,d5
move.w FIRSTU,d4
move.w MIDU,d5
lsl.l #8,d4
lsl.l #8,d5
sub.l d4,d5
divs.l FIRSTLEN-2,d5
move.w d4,d2
move.w d5,d7
move.l d7,a1
moveq #0,d4
moveq #0,d5
; move.b d6,d5
; move.b d3,d4
; swap d5
; swap d4
move.w FIRSTV,d4
move.w MIDV,d5
swap d4
swap d5
sub.l d4,d5
divs.l FIRSTLEN-2,d5
move.l d5,a3
move.l d4,d5
clr.w d3
clr.w d6
sub.l d3,d6
divs.l d0,d6
move.l d6,a4
move.w RIGHTUVS-LEFTUVS(a0),d7
move.w (a0)+,d4
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
; move.w RIGHTUVS-LEFTUVS(a0),d7
; swap d7
; clr.w d7
move.w (a0)+,d7
; swap d5
; clr.w d5
; sub.l d5,d7
; divs.l d0,d7
; move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d6
swap d6
clr.w d6
sub.l d6,d7
divs.l d0,d7
lsl.l #8,d6
lsl.l #8,d7
move.w RIGHTBRIGHT,d7
move.l d7,a6
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes3
and.w #$7fff,d7
add.l #65536*4,a0
.okaddtes3:
ext.l d7
; add.l d7,d7
asl.l #8,d7
add.l d7,a0
move.w #0,d7
move.w LEFTBRIGHT,d6
subq #1,d0
swap d0
move.w HIGHPOLY,d0
swap d0
; d0=xdist
; d2=U a1=DU
; d3=V a4=DV
; d4=X a5=DX
; d5=Y a6=DY
; d6=Z a3=DZ
; d0= polynum : polynum : counter : counter
; d1= scratch : scratch : scratch : scratch
; d2= u : uacc : sv : svacc
; d3= v : v : vacc : vacc
; d4= x : x : xacc : xacc
; d5= su : su : suacc : suacc
; d6= z : zacc : bright : brightacc
; d7= scratch : scratch : scratch : scratch
; a0= textures
; a1= uspeed : uspeed : suspeed : suspeed
; a2= screen pointer
; a3= svspeed : svspeed : svspeed : svspeed
; a4= vspeed : vspeed : vspeed : vspeed
; a5= xspeed : xspeed : xspeed : xspeed
; a6= zspeed : zspeed :brightspeed : brightspeed
; a7= shadowmap pointer
move.w FIRSTLEN,d0
sub.w #1,d0
bsr STARTLINE
move.l #0,d5
move.w #0,d2
move.l #0,a3
move.w LASTLEN,d0
sub.w #1,d0
bsr STARTLINE
move.l (a7)+,d1
move.l (a7)+,a0
move.l (a7)+,a2
bra .noline
.firstaway:
tst.w d3
bge .bothaway
; first is away and second is towards...
; this really isn't going to work...
move.w d0,d7 ; total length
move.w d0,d6
neg.w d3
add.w d2,d3
muls d2,d6
divs d3,d6 ; length of first bit
sub.w d6,d7 ; length of second bit
move.w d6,FIRSTLEN
move.w d7,LASTLEN
tst.w FIRSTLEN
beq .bothaway
tst.w LASTLEN
beq .bothtowards
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
move.b 6(a0),d2
move.b 7(a0),d3
move.w d2,FIRSTU
move.w d3,FIRSTV
move.w d2,d4
move.w d3,d5
sub.w #128,d2
sub.w #128,d3
muls d2,d2
muls d3,d3
add.l d3,d2
jsr CALCSQROOT
tst.w d2
beq.s .nochng22
sub.w #128,d4
sub.w #128,d5
muls #127,d4
muls #127,d5
divs d2,d4
divs d2,d5
add.w #128,d4
add.w #128,d5
.nochng22:
move.w d4,MIDU
move.w d5,MIDV
moveq #0,d4
moveq #0,d5
move.b 6+RIGHTUVS-LEFTUVS(a0),d4
move.b 7+RIGHTUVS-LEFTUVS(a0),d5
move.w d4,SECU
move.w d5,SECV
move.w d4,d2
move.w d5,d3
sub.w #128,d2
sub.w #128,d3
muls d2,d2
muls d3,d3
add.l d3,d2
jsr CALCSQROOT
tst.w d2
beq.s .nochng222
sub.w #128,d4
sub.w #128,d5
muls #127,d4
muls #127,d5
divs d2,d4
divs d2,d5
add.w #128,d4
add.w #128,d5
.nochng222:
add.w MIDU,d4
add.w MIDV,d5
asr.w #1,d4
asr.w #1,d5
move.w d4,MIDU
move.w d5,MIDV
move.l RIGHTUVS-LEFTUVS(a0),d7
move.l (a0)+,d2
and.l #$ffffff,d2
and.l #$ffffff,d7
moveq #0,d3
moveq #0,d5
move.w d2,d3
move.w d7,d5
swap d3
swap d5
sub.l d3,d5
divs.l d0,d5
asr.l #8,d5
move.w d5,RIGHTBRIGHT
asr.l #8,d3
move.w d3,LEFTBRIGHT
clr.w d2
clr.w d7
sub.l d2,d7
asl.l #8,d2
divs.l d0,d7
asl.l #8,d7
move.l RIGHTUVS-LEFTUVS(a0),d6
move.l (a0)+,d3
moveq #0,d4
moveq #0,d5
move.w MIDU,d4
move.w SECU,d5
lsl.w #8,d4
lsl.w #8,d5
; move.w d6,d5
; move.w d3,d4
; move.b #0,d4
; move.b #0,d5
sub.l d4,d5
divs.l LASTLEN-2,d5
move.w d4,d2
move.w d5,d7
move.l d7,a1
moveq #0,d4
moveq #0,d5
move.w MIDV,d4
move.w SECV,d5
swap d5
swap d4
sub.l d4,d5
divs.l LASTLEN-2,d5
move.l d5,a3
move.l d4,d5
clr.w d3
clr.w d6
sub.l d3,d6
divs.l d0,d6
move.l d6,a4
move.w RIGHTUVS-LEFTUVS(a0),d7
move.w (a0)+,d4
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
; move.w RIGHTUVS-LEFTUVS(a0),d7
; swap d7
; clr.w d7
move.w (a0)+,d7
; swap d5
; clr.w d5
; sub.l d5,d7
; divs.l d0,d7
; move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d6
swap d6
clr.w d6
sub.l d6,d7
divs.l d0,d7
lsl.l #8,d6
lsl.l #8,d7
move.w RIGHTBRIGHT,d7
move.l d7,a6
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes4
and.w #$7fff,d7
add.l #65536*4,a0
.okaddtes4:
ext.l d7
; add.l d7,d7
asl.l #8,d7
add.l d7,a0
move.w #0,d7
move.w LEFTBRIGHT,d6
subq #1,d0
swap d0
move.w HIGHPOLY,d0
swap d0
; d0=xdist
; d2=U a1=DU
; d3=V a4=DV
; d4=X a5=DX
; d5=Y a6=DY
; d6=Z a3=DZ
; d0= polynum : polynum : counter : counter
; d1= scratch : scratch : scratch : scratch
; d2= u : uacc : sv : svacc
; d3= v : v : vacc : vacc
; d4= x : x : xacc : xacc
; d5= su : su : suacc : suacc
; d6= z : zacc : bright : brightacc
; d7= scratch : scratch : scratch : scratch
; a0= textures
; a1= uspeed : uspeed : suspeed : suspeed
; a2= screen pointer
; a3= svspeed : svspeed : svspeed : svspeed
; a4= vspeed : vspeed : vspeed : vspeed
; a5= xspeed : xspeed : xspeed : xspeed
; a6= zspeed : zspeed :brightspeed : brightspeed
; a7= shadowmap pointer
move.w d2,-(a7)
move.l d5,-(a7)
move.l a3,-(a7)
move.w #0,d2
move.l #0,d5
move.l #0,a3
move.w FIRSTLEN,d0
subq #1,d0
bsr STARTLINE
move.l (a7)+,a3
move.l (a7)+,d5
move.w (a7)+,d2
move.w LASTLEN,d0
subq #1,d0
bsr STARTLINE
move.l (a7)+,d1
move.l (a7)+,a0
move.l (a7)+,a2
bra .noline
.bothaway:
move.w #0,6+RIGHTUVS-LEFTUVS(a0)
move.w #0,6(a0)
.bothtowards:
move.l RIGHTUVS-LEFTUVS(a0),d7
move.l (a0)+,d2
and.l #$ffffff,d2
and.l #$ffffff,d7
moveq #0,d3
moveq #0,d5
move.w d2,d3
move.w d7,d5
swap d3
swap d5
sub.l d3,d5
divs.l d0,d5
asr.l #8,d5
move.w d5,RIGHTBRIGHT
asr.l #8,d3
move.w d3,LEFTBRIGHT
clr.w d2
clr.w d7
sub.l d2,d7
asl.l #8,d2
divs.l d0,d7
asl.l #8,d7
move.l RIGHTUVS-LEFTUVS(a0),d6
move.l (a0)+,d3
moveq #0,d4
moveq #0,d5
move.w d6,d5
move.w d3,d4
move.b #0,d4
move.b #0,d5
sub.l d4,d5
divs.l d0,d5
move.w d4,d2
move.w d5,d7
move.l d7,a1
moveq #0,d4
moveq #0,d5
move.b d6,d5
move.b d3,d4
swap d5
swap d4
sub.l d4,d5
divs.l d0,d5
move.l d5,a3
move.l d4,d5
clr.w d3
clr.w d6
sub.l d3,d6
divs.l d0,d6
move.l d6,a4
move.w RIGHTUVS-LEFTUVS(a0),d7
move.w (a0)+,d4
swap d7
clr.w d7
swap d4
clr.w d4
sub.l d4,d7
divs.l d0,d7
move.l d7,a5
; move.w RIGHTUVS-LEFTUVS(a0),d7
; swap d7
; clr.w d7
move.w (a0)+,d7
; swap d5
; clr.w d5
; sub.l d5,d7
; divs.l d0,d7
; move.l d7,a6
move.w RIGHTUVS-LEFTUVS(a0),d7
swap d7
clr.w d7
move.w (a0)+,d6
swap d6
clr.w d6
sub.l d6,d7
divs.l d0,d7
lsl.l #8,d6
lsl.l #8,d7
move.w RIGHTBRIGHT,d7
move.l d7,a6
move.l a0,-(a7)
move.l d1,-(a7)
move.l #TEXTURES,a0
move.w TEXTUREADD,d7
bge.s .okaddtes5
and.w #$7fff,d7
add.l #65536*4,a0
.okaddtes5:
ext.l d7
asl.l #8,d7
add.l d7,a0
move.w #0,d7
move.w LEFTBRIGHT,d6
subq #1,d0
swap d0
move.w HIGHPOLY,d0
swap d0
; d0=xdist
; d2=U a1=DU
; d3=V a4=DV
; d4=X a5=DX
; d5=Y a6=DY
; d6=Z a3=DZ
; d0= polynum : polynum : counter : counter
; d1= scratch : scratch : scratch : scratch
; d2= u : uacc : sv : svacc
; d3= v : v : vacc : vacc
; d4= x : x : xacc : xacc
; d5= su : su : suacc : suacc
; d6= z : zacc : bright : brightacc
; d7= scratch : scratch : scratch : scratch
; a0= textures
; a1= uspeed : uspeed : suspeed : suspeed
; a2= screen pointer
; a3= svspeed : svspeed : svspeed : svspeed
; a4= vspeed : vspeed : vspeed : vspeed
; a5= xspeed : xspeed : xspeed : xspeed
; a6= zspeed : zspeed :brightspeed : brightspeed
; a7= shadowmap pointer
bsr STARTLINE
move.l (a7)+,d1
move.l (a7)+,a0
move.l (a7)+,a2
.noline:
add.w #320,a2
swap d1
dbra d1,DOAHORLINEGOUR
bra NOPOLYGON
*******************************
STARTLINE:
move.l a7,SAVESTACK
move.l #SHADOWBUFFER,a7
moveq #0,d1
swap d6
move.w d6,d1
swap d4
move.b d4,d1
swap d4
swap d6
swap d0
moveq #0,d7
move.b (a7,d1.l*2),d7
cmp.w d7,d0
ble .startlight
swap d0
bra INTHEDARKGOUR
.startlight:
swap d0
bra INTHELIGHTGOUR
.startdark:
***********************************
PENUMBRAGOUR:
moveq #0,d1
swap d6
move.w d6,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a6,d6
add.l a3,d5
swap d0
moveq #0,d7
move.b (a7,d1.l*2),d7
cmp.w d7,d0
ble INTOLIGHTGOUR
bra.s INTODARKGOUR
INTHEDARKGOUR:
moveq #0,d1
swap d6
move.w d6,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a6,d6
add.l a3,d5
swap d0
moveq #0,d7
move.b (a7,d1.l*2),d7
cmp.w d7,d0
ble.s INTOPENUMGOUR
INTODARKGOUR:
swap d0
move.w #$5c00,d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b 1(a0,d1.w*4),d7
bra DARKplottt
.noplottt
addq #1,a2
dbra d0,INTHEDARKGOUR
bra DONEDONEBUM
INTOPENUMGOUR:
swap d0
move.w d6,d7
sub.w #$5c00,d7
asr.w #1,d7
add.w #$5c00,d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
add.l a1,d2
add.l a4,d3
move.b 1(a0,d1.w*4),d7
bra.s PENUMplottt
.noplottt
addq #1,a2
dbra d0,PENUMBRAGOUR
bra DONEDONEBUM
INTHELIGHTGOUR:
moveq #0,d1
swap d6
move.w d6,d1
swap d4
move.b d4,d1
swap d4
swap d6
add.l a5,d4
add.l a6,d6
add.l a3,d5
swap d0
moveq #0,d7
move.b (a7,d1.l*2),d7
cmp.w d7,d0
bgt.s INTOPENUMGOUR
INTOLIGHTGOUR:
swap d0
move.w d6,d7
swap d7
swap d2
move.w d2,d1
swap d3
move.b d3,d1
swap d2
swap d3
move.l (a0,d1.w*4),d1
move.w d1,d7
add.l a1,d2
add.l a4,d3
bra.s LIGHTPLOTT
.noplottt:
addq #1,a2
dbra d0,INTHELIGHTGOUR
FLIBBLEY:
bra.s DONEDONEBUM
PENUMplottt
move.b GOURPAL(pc,d7.w),(a2)+
dbra d0,PENUMBRAGOUR
bra.s DONEDONEBUM
DARKplottt
move.b GOURPAL(pc,d7.w),(a2)+
dbra d0,INTHEDARKGOUR
bra.s DONEDONEBUM
LIGHTPLOTT:
move.w d2,d1
swap d5
move.b d5,d1
swap d5
add.w d7,d1
swap d1
move.w d1,d7
sub.w d1,d1
swap d1
move.b 1(a7,d1.l*2),d1 ; specular value of point.
lsl.w #8,d1
neg.w d1
add.w #31*256,d1
add.w d7,d1
swap d7
move.b d1,d7
move.b GOURPAL(pc,d7.w),d1
move.b GOURPAL(pc,d1.w),(a2)+
dbra d0,INTHELIGHTGOUR
DONEDONEBUM:
move.l SAVESTACK,a7
rts
GOURPAL: incbin "ab3:includes/shadow.pal"
LEFTSHINEV: dc.l 0
RIGHTSHINEV: dc.l 0
LEFTSHINEU: dc.l 0
RIGHTSHINEU: dc.l 0
TOPPTR: dc.l 0
TOPPTNUM: dc.w 0
BOTPTNUM: dc.w 0
LEFTBRIGHT: dc.w 0
RIGHTBRIGHT: dc.l 0
LEFTSPEC: dc.w 0
RIGHTSPEC: dc.w 0
***********************************************
SIMPLECALCLINE:
move.l #ONSCREENPTS,a1
move.w 2(a1,d0.w*4),d2 ;fy
move.w 2(a1,d1.w*4),d7 ;sy
move.l #RIGHTUVS,a3
asr.w #2,d2
asr.w #2,d7
cmp.w d2,d7
beq .noline
bgt.s .lineonright
.lineonleft:
move.l #LEFTUVS,a3
exg d0,d1
exg d2,d7
.lineonright:
move.w d0,TOPPTNUM
move.w d1,BOTPTNUM
sub.w d2,d7
asl.w #4,d2
add.w d2,a3
move.l a3,TOPPTR
move.w d7,YDIFF
move.w (a1,d0.w*4),d3 ;fx
move.w (a1,d1.w*4),d7 ;sx
sub.w d3,d7
swap d3
swap d7
clr.w d3
clr.w d7
divs.l YDIFF-2,d7
move.l d7,a0 ; dx
move.l #UVCOORDS,a2
move.l #SHADOWPTS,a1
move.w (a2,d0.w*4),d4
move.w 2(a2,d0.w*4),d5
move.w (a2,d1.w*4),d6
move.w 2(a2,d1.w*4),d7
sub.w d4,d6
sub.w d5,d7
swap d4
swap d5
clr.w d4
clr.w d5
swap d6
swap d7
clr.w d6
clr.w d7
divs.l YDIFF-2,d6
divs.l YDIFF-2,d7
move.l d6,a4
move.l d7,a5
muls #10,d0
muls #10,d1
move.l (a1,d0.w),d6
move.l (a1,d1.w),d7
asl.l #5,d6
asl.l #5,d7
sub.l d6,d7
divs.l YDIFF-2,d7
move.l d7,a2
move.l d6,a6
move.l 4(a1,d0.w),d6
move.l 4(a1,d1.w),d7
asl.l #5,d6
asl.l #5,d7
sub.l d6,d7
divs.l YDIFF-2,d7
exg d7,a6
exg d7,d6
move.w 8(a1,d0.w),d0
move.w 8(a1,d1.w),d1
swap d0
swap d1
clr.w d0
clr.w d1
asr.l #2,d0
asr.l #2,d1
sub.l d0,d1
divs.l YDIFF-2,d1
move.l d1,a1
move.l YDIFF-2,d1
subq #1,d1
; d3=sx a0=dsx
; d4=u a4=du
; d5=v a5=dv
; d6=x a2=dx
; d7=y a6=dy
; d0=z a1=dz
; d1=dsy
add.l #128*65536,d6
add.l #128*65536,d7
add.l #128*65536,d0
.PUTINLINE:
swap d3
move.w d3,(a3)+
swap d3
add.l a0,d3
move.l d4,(a3)+
add.l a4,d4
move.l d5,(a3)+
swap d6
add.l a5,d5
move.w d6,(a3)+
swap d6
swap d7
add.l a2,d6
move.w d7,(a3)+
swap d7
swap d0
add.l a6,d7
move.w d0,(a3)+
swap d0
add.l a1,d0
dbra d1,.PUTINLINE
tst.b Gouraud
beq .noline
move.w TOPPTNUM,d0
move.w BOTPTNUM,d1
move.l TOPPTR,a3
moveq #0,d6
move.w YDIFF,d6
move.l #SPECBRIGHTS,a2
moveq #0,d2
moveq #0,d3
move.b (a2,d0.w*4),d2
move.b 1(a2,d0.w*4),d3
sub.w #128,d2
sub.w #128,d3
move.w d2,d4
move.w d3,d5
muls ACOS,d2
muls ASIN,d3
sub.l d3,d2
muls ASIN,d4
muls ACOS,d5
add.l d5,d4
asl.l #2,d2
swap d2
asl.l #2,d4
swap d4
add.w #128,d2
add.w #128,d4
move.w d2,FSX
move.w d4,FSY
moveq #0,d2
moveq #0,d3
move.b (a2,d1.w*4),d2
move.b 1(a2,d1.w*4),d3
sub.w #128,d2
sub.w #128,d3
move.w d2,d4
move.w d3,d5
muls ACOS,d2
muls ASIN,d3
sub.l d3,d2
muls ASIN,d4
muls ACOS,d5
add.l d5,d4
asl.l #2,d2
swap d2
asl.l #2,d4
swap d4
add.w #128,d2
add.w #128,d4
move.w d2,SSX
move.w d4,SSY
move.w 2(a2,d0.w*4),d2
move.w 2(a2,d1.w*4),d3
asr.w #4,d2
asr.w #4,d3
bra .bothtowards
tst.w d2
blt .firsttowards
bgt.s .firstaway
tst.w d3
ble .bothtowards
bra .bothaway
.firstaway
tst.w d3
blt .sectowards
bra .bothaway
.firsttowards:
tst.w d3
ble .bothtowards
; First one is towards, the second away.
; Do the line in two bits: one heading
; from the first point to the rim, the
; other heading from the rim to the second
; point and flagged as behind.
move.w d6,d7 ; total length to draw
move.w d2,FIRSTY
move.w d3,LASTY
neg.w d2
add.w d2,d3 ; total change in Y
bra.s .onetowards
.sectowards:
move.w d6,d7 ; total length to draw
move.w d2,FIRSTY
move.w d3,LASTY
neg.w d3
add.w d2,d3
.onetowards:
muls d2,d6
divs d3,d6 ; length of first bit of line.
ext.l d6
ext.l d7
move.w d6,FIRSTLEN
sub.l d6,d7
move.w d7,LASTLEN
add.l d7,d6
move.w FIRSTY,d2
move.w LASTY,d3
swap d2
clr.w d2
swap d3
clr.w d3
sub.l d2,d3
divs.l d6,d3
move.l d3,a6
move.l d2,d7
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
move.b (a2,d0.w*4),d2
move.b 1(a2,d0.w*4),d3
move.w d2,FIRSTU
move.w d3,FIRSTV
move.w d2,d4
move.w d3,d5
sub.w #128,d2
sub.w #128,d3
muls d2,d2
muls d3,d3
add.l d3,d2
jsr CALCSQROOT
tst.w d2
beq.s .nochng
sub.w #128,d4
sub.w #128,d5
muls #127,d4
muls #127,d5
divs d2,d4
divs d2,d5
add.w #128,d4
add.w #128,d5
.nochng:
move.w d4,MIDU
move.w d5,MIDV
move.b (a2,d1.w*4),d4
move.b 1(a2,d1.w*4),d5
move.w d4,SECU
move.w d5,SECV
; move.w d4,d2
; move.w d5,d3
;
; sub.w #128,d2
; sub.w #128,d3
; muls d2,d2
; muls d3,d3
; add.l d3,d2
; jsr CALCSQROOT
;
; tst.w d2
; beq.s .nochng2
;
; sub.w #128,d4
; sub.w #128,d5
; muls #127,d4
; muls #127,d5
; divs d2,d4
; divs d2,d5
; add.w #128,d4
; add.w #128,d5
;
;.nochng2:
;
; add.w MIDU,d4
; add.w MIDV,d5
; asr.w #1,d4
; asr.w #1,d5
; move.w d4,MIDU
; move.w d4,MIDV
move.l #NORMBRIGHTS,a2
move.w (a2,d0.w*2),d0
move.w (a2,d1.w*2),d1
sub.w d0,d1
swap d1
swap d0
divs.l d6,d1
move.w FIRSTLEN,d6
beq.s .nofirstbit
ext.l d6
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
move.w FIRSTU,d2
move.w MIDU,d3
move.w FIRSTV,d4
move.w MIDV,d5
sub.w d2,d3
swap d2
swap d3
divs.l d6,d3
move.l d3,a4
sub.w d4,d5
swap d4
swap d5
divs.l d6,d5
move.l d5,a5
bsr DOABITOFLINE
.nofirstbit:
move.w LASTLEN,d6
beq.s .nosecbit
ext.l d6
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
move.w MIDU,d2
move.w SECU,d3
move.w MIDV,d4
move.w SECV,d5
sub.w d2,d3
swap d2
swap d3
divs.l d6,d3
move.l d3,a4
sub.w d4,d5
swap d4
swap d5
divs.l d6,d5
move.l d5,a5
bsr DOABITOFLINE
.nosecbit:
bra .noline
.bothaway
; Both are away, so do it simply.
.bothtowards:
; Both are towards, so do it simply and flag all
; points as towards.
swap d2
clr.w d2
swap d3
clr.w d3
sub.l d2,d3
divs.l d6,d3
move.l d3,a6
move.l d2,d7
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
; move.b (a2,d0.w*4),d2
; move.b (a2,d1.w*4),d3
; move.b 1(a2,d0.w*4),d4
; move.b 1(a2,d1.w*4),d5
move.w FSX,d2
move.w SSX,d3
move.w FSY,d4
move.w SSY,d5
sub.w d2,d3
swap d2
swap d3
divs.l d6,d3
move.l d3,a4
sub.w d4,d5
swap d4
swap d5
divs.l d6,d5
move.l d5,a5
move.l #NORMBRIGHTS,a2
move.w (a2,d0.w*2),d0
move.w (a2,d1.w*2),d1
sub.w d0,d1
swap d1
swap d0
divs.l d6,d1
bsr DOABITOFLINE
.noline:
rts
DOABITOFLINE:
subq #1,d6
.STICKINGOUR:
swap d7
move.b d7,2(a3)
swap d7
add.l a6,d7
swap d0
move.w d0,4(a3)
swap d0
add.l d1,d0
swap d2
move.b d2,8(a3)
swap d4
move.b d4,9(a3)
swap d4
adda.w #16,a3
swap d2
add.l a4,d2
add.l a5,d4
dbra d6,.STICKINGOUR
rts
FIRSTY: dc.w 0
LASTY: dc.w 0
FIRSTU: dc.w 0
SECU: dc.w 0
FIRSTV: dc.w 0
SECV: dc.w 0
dc.w 0
FIRSTLEN: dc.w 0
dc.w 0
LASTLEN: dc.w 0
MIDU: dc.w 0
MIDV: dc.w 0
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
************************************************
move.w d3,TOPLINE
move.w d4,BOTLINE
*********************************************
CALCSQROOT:
tst.l d2
beq .oksqr
movem.l d0/d1/d3-d7/a0-a6,-(a7)
move.w #31,d0
.findhigh
btst d0,d2
bne .foundhigh
dbra d0,.findhigh
.foundhigh
asr.w #1,d0
clr.l d3
bset d0,d3
move.l d3,d0
move.w d0,d1
muls d1,d1 ; x*x
sub.l d2,d1 ; x*x-a
asr.l #1,d1 ; (x*x-a)/2
divs d0,d1 ; (x*x-a)/2x
sub.w d1,d0 ; second approx
bgt .stillnot0
move.w #1,d0
.stillnot0
move.w d0,d1
muls d1,d1
sub.l d2,d1
asr.l #1,d1
divs d0,d1
sub.w d1,d0 ; second approx
bgt .stillnot02
move.w #1,d0
.stillnot02
move.w d0,d1
muls d1,d1
sub.l d2,d1
asr.l #1,d1
divs d0,d1
sub.w d1,d0 ; second approx
bgt .stillnot03
move.w #1,d0
.stillnot03
move.w d0,d2
ext.l d2
movem.l (a7)+,d0/d1/d3-d7/a0-a6
.oksqr
rts
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
********************** ************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
TOPLINE: dc.w 0
BOTLINE: dc.w 0
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
**********************************************
dc.w 0
YDIFF: dc.w 0
SPINAROUND: dc.w 0
XCOS: dc.w 0
YCOS: dc.w 0
XSIN: dc.w 0
YSIN: dc.w 0
XCOS3: dc.w 0
YCOS3: dc.w 0
XSIN3: dc.w 0
YSIN3: dc.w 0
XCOS2: dc.w 0
YCOS2: dc.w 0
XSIN2: dc.w 0
YSIN2: dc.w 0
XADD: dc.l 0
YADD: dc.l 0
ZADD: dc.l 0
XOFF: dc.w 0
YOFF: dc.w 0
OLDXM: dc.w 0
OLDYM: dc.w 0
TEXTUREADD: dc.w 0
**********************************************************
UVCOORDS: ds.l 250
ROTATEDPTS: ds.l 250*4
SHADOWPTS: ds.l 250*4
ONSCREENPTS: ds.l 250
ZOFF: dc.w 768
LEFTRIGHT: ds.l 256
POLYGONDATA:
ds.b 30000
OBJNAME: dc.b "ab3:vectobj/testcube",0
even
doslibname: dc.b 'dos.library',0
even
doslib: dc.l 0
****************************
SINETABLE:
incbin "ab3:includes/bigsine"
YANG: dc.w 0
XANG: dc.w 0
xmouse: dc.w 0
ymouse: dc.w 0
spleen: dc.w 0
lastspleen: dc.w 0
COPIEDPAL:
dc.w 256,0
ds.l 3*256
ds.l 10
SHADOWBUFFER:
HIGHLIGHT: incbin "work:temp/HIGHLIGHT"
PALETTEBIT:
; incbin "256palette"
; dc.w $ffff,$fffe
incbin "ab3:shadowtex/shadowpal"
include "ab3:source_4000/chunky.s"
willy: ds.w 48
PALS:
ds.l 2*49
pregour: dc.b 0
Gouraud: dc.b 0
PointAngPtr: dc.l 0
FRAMENUM: dc.w 0
PolyAngPtr: dc.l 0
PtsPtr: dc.l 0
LinesPtr: dc.l 0
POINTER_TO_POINTERS: dc.l 0
FRAME: dc.w 4
FLIBBLE: dc.w 0
START_OF_OBJECT: dc.l 0
num_points: dc.w 0
num_frames: dc.w 0
SORTIT: dc.w 0
PartBuffer: ds.l 2*32
endparttab:
x1: dc.w 0
y1: dc.w 0
z1: dc.w 0
x2: dc.w 0
y2: dc.w 0
z2: dc.w 0
x2b: dc.w 0
y2b: dc.w 0
z2b: dc.w 0
x3: dc.w 0
y3: dc.w 0
z3: dc.w 0
l1: dc.w 0
l2: dc.w 0
OBJONOFF: dc.l 0
SAVEHIGHS: ds.w 30
FASTBUFFER:
dc.l fasty
fasty: ds.b 320*256
NORMBRIGHTS: ds.w 250
SPECBRIGHTS:
dcb.l 100,31
ENDNORM:
LEFTUVS: ds.w 8*256
RIGHTUVS: ds.w 8*256
NORMVECTS: ds.w 3*250
;WORLD: incbin "ab3:includes/world"
;TWEEN: incbin "ab3:includes/tweenbrightfile"
NEBBIE: incbin "work:temp/nebbieroar"
ds.l (192/4)*16
SECTION blib,code_f
TEXTURES:
incbin "ab3:includes/shadowmaps"
even
SECTION BGDROP,code_c
RAWSCRN:
ds.l 2560*8